package _go

/*1171. 从链表中删去总和值为零的连续节点
难度
中等

131

收藏

分享
切换为英文
接收动态
反馈
给你一个链表的头节点 head，请你编写代码，反复删去链表中由 总和 值为 0 的连续节点组成的序列，直到不存在这样的序列为止。

删除完毕后，请你返回最终结果链表的头节点。



你可以返回任何满足题目要求的答案。

（注意，下面示例中的所有序列，都是对 ListNode 对象序列化的表示。）

示例 1：

输入：head = [1,2,-3,3,1]
输出：[3,1]
提示：答案 [1,2,1] 也是正确的。
示例 2：

输入：head = [1,2,3,-3,4]
输出：[1,2,4]
示例 3：

输入：head = [1,2,3,-3,-2]
输出：[1]


提示：

给你的链表中可能有 1 到 1000 个节点。
对于链表中的每个节点，节点的值：-1000 <= node.val <= 1000.*/

/*思路  前缀和*/
/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func removeZeroSumSublists(head *ListNode) *ListNode {
	dummy := &ListNode{0, head}
	sum := 0
	dict := make(map[int]*ListNode)
	for p := dummy; p != nil; p = p.Next {
		sum += p.Val
		dict[sum] = p
		//fmt.Printf("dict %+v \n",dict)
	}
	sum = 0
	for p := dummy; p != nil; p = p.Next {
		sum += p.Val
		//fmt.Printf("sum %d next:%d \n",sum,dict[sum].Val)
		p.Next = dict[sum].Next
	}
	return dummy.Next
}
